package base;

import configs.Configuracao;
import funcoes.IFuncao;

public class Particula {
	public double[] posicao;
	public double fitness;
	public double[] velocidade;
	public IFuncao funcao;
	public double fitnessPbest;
	public double[] posicaoPbest;
	
	
	public Particula(IFuncao funcao)
	{
		this.funcao = funcao;
		this.posicao = new double[Configuracao.DIMENSOES];
		this.velocidade = new double[Configuracao.DIMENSOES];
		inicializar();

	}
	
	public void inicializar()
	{
		for(int i=0; i<Configuracao.DIMENSOES; i++)
		{
			//inicializacao mais dificil
//			this.posicao[i] = Configuracao.rand.nextDouble()*0.5*Configuracao.ESPACO_BUSCA[1] + 0.5*Configuracao.ESPACO_BUSCA[1];
			//inicializacao mais simples
			this.posicao[i] = Configuracao.rand.nextDouble()*2*Configuracao.ESPACO_BUSCA[1] + Configuracao.ESPACO_BUSCA[0];
		}
		for(int i=0; i<Configuracao.DIMENSOES; i++)
		{
			this.velocidade[i] = 2*Configuracao.LIMITE_VELOCIDADE[1]*Configuracao.rand.nextDouble()+Configuracao.LIMITE_VELOCIDADE[0]; 
		}
		fitness = funcao.calcularAptidao(posicao);
		this.posicaoPbest = posicao;
		fitnessPbest = fitness;
	}
	
	
	public void avaliar()
	{
		fitness = funcao.calcularAptidao(posicao);
		if(fitness < fitnessPbest)
		{
			fitnessPbest = fitness;
			posicaoPbest = posicao.clone();
		}
	}
	
	
}
